//输入一个英文句子，翻转句子中单词的顺序，但单词内字符的顺序不变。为简单起见，标点符号和普通字母一样处理。例如输入字符串"I am a student. "，
//则输出"student. a am I"。 
//
// 
//
// 示例 1： 
//
// 输入: "the sky is blue"
//输出: "blue is sky the"
// 
//
// 示例 2： 
//
// 输入: "  hello world!  "
//输出: "world! hello"
//解释: 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
// 
//
// 示例 3： 
//
// 输入: "a good   example"
//输出: "example good a"
//解释: 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
// 
//
// 
//
// 说明： 
//
// 
// 无空格字符构成一个单词。 
// 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。 
// 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。 
// 
//
// 注意：本题与主站 151 题相同：https://leetcode-cn.com/problems/reverse-words-in-a-string/ 
//
//
// 注意：此题对比原题有改动 
// Related Topics 双指针 字符串 👍 123 👎 0


package leetcode.editor.cn1;

//Java：翻转单词顺序

import java.util.ArrayList;
import java.util.List;

/**
 * 输入一个英文句子，翻转句子中单词的顺序，
 * 但单词内字符的顺序不变。为简单起见，标点符号和普通字母一样处理。例如输入字符串"I am a student. "，则输出"student. a am I"。
 * 无空格字符构成一个单词
 * 输入字符串可以在前面或者后面包含多余的空格，但是反转后的字符不能包括。
 * 如果两个单词间有多余的空格，将反转后单词间的空格减少到只含一个。
 * <p>
 * "a good   example"
 * "example good a"
 */
public class FanZhuanDanCiShunXuLcof {
    public static void main(String[] args) {
        Solution solution = new FanZhuanDanCiShunXuLcof().new Solution();
        // TO TEST
        System.out.println(solution.reverseWords("   a    sgood   example   "));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public String reverseWords(String s) {
            // 先剔除前面的空格，和后面的空格
            List<String> list = new ArrayList<>();
            int nlen = s.length();
            int i = -1, j = -1;
            for (int k = 0; k < nlen; k++) {
                // 记录非空字符的开始位置和结束位置
                if (s.charAt(k) != ' ') {
                    if (i == -1) {
                        i = k;
                    }
                } else {
                    if (i > -1) {
                        list.add(s.substring(i, k));
                    }
                    i = -1;
                }
            }
            // 计算最后一个
            if (i != -1) {
                list.add(s.substring(i, s.length()));
            }
            StringBuilder sb = new StringBuilder("");
            int llen = list.size();
            for (int k = llen - 1; k >= 0; k--) {
                sb.append(list.get(k) + " ");
            }
            return sb.toString().trim();
        }
    }
//leetcode submit region end(Prohibit modification and deletion)

}
